package interfaceusuario;

import entidadesparaguardardadosteste.CasoDeTeste;
import gui.ExecutadorDeCasosDeTeste;


import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.LinkedList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import propertieslinguagem.SingletonSetaLinguagemEArmazenaResourceBundle;

import salvarcasodetestes.DadosCasoDeTestesComMain;
import salvarcasodetestes.DadosProjetoDeTestesComMain;
import tabela.LinhaTabela;
import tabela.PainelTabela;

import compilarclassejava.FachadaTestarMain;
import compilarclassejava.PreparaCasoDeTesteComMain;
import compilarclassejava.PreparaCasosDeTesteGetVariaveisSaida;
import compilarclassejava.PreparaCasosDeTesteSetVariaveisEntrada;
import compilarclassejava.TelaMostraConteudoDeArquivoEmUmTextArea;

public class TelaDefinaValoresParaVariaveisSystemInEOut implements ActionListener, MouseListener
{
	private int quantasVariaveisCriadasParaSubstituirLeituraDoTeclado;
	private int quantasVariaveisCriadasParaSubstituirEscritaNoTerminal; 
	
	private JFrame janelaDefinaValoresParaVariaveisSystemInEOut;
	private JButton botaoTestar;
	private JLabel botaoHelp;
	
	private String enderecoDoArquivoJavaEscolhidoParaTestar;

	private PainelTabela tabelaCasosDeTesteCriados;
	private LinkedList<String> cabecalhoDaTabela;
	
	private LinkedList<CasoDeTeste> casosDeTesteCriadosParaSeTestar;
	private DadosProjetoDeTestesComMain projetoDeTestesSendoCriado;
	
	
	public TelaDefinaValoresParaVariaveisSystemInEOut(String enderecoDorquivoJavaEscolhidoParaTestar, String nomeDoProjetoDeTestes, JFrame janelaPrincipalTestable)
	{
		SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
				SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
		String tituloJanela = conheceLinguagemDoSistema.getString("janelaDefinaValoresParaVariaveisSystemInEOutTelaDefinaValoresParaVariaveisSystemInEOut");
		
		this.janelaDefinaValoresParaVariaveisSystemInEOut = janelaPrincipalTestable;
		this.janelaDefinaValoresParaVariaveisSystemInEOut.setTitle(tituloJanela);
		
		FachadaTestarMain conheceQuantasVariaveisCriadasParaSustituirEntradasESaidas =
																FachadaTestarMain.getInstance();
		this.quantasVariaveisCriadasParaSubstituirLeituraDoTeclado =
				conheceQuantasVariaveisCriadasParaSustituirEntradasESaidas.getQuantasVariaveisCriadasParaSubstituirSystemIns();
		this.quantasVariaveisCriadasParaSubstituirEscritaNoTerminal =
				conheceQuantasVariaveisCriadasParaSustituirEntradasESaidas.getQuantasVariaveisCriadasParaSubstituirSystemOuts();
		
		this.enderecoDoArquivoJavaEscolhidoParaTestar = enderecoDorquivoJavaEscolhidoParaTestar;
		this.casosDeTesteCriadosParaSeTestar = new LinkedList<CasoDeTeste>();
		
		
		
		this.projetoDeTestesSendoCriado = new DadosProjetoDeTestesComMain();
		this.projetoDeTestesSendoCriado.setEnderecoArquivoJavaEscolhidoParaTestar(enderecoDoArquivoJavaEscolhidoParaTestar);
		this.projetoDeTestesSendoCriado.setNomeProjetoDeTestes(nomeDoProjetoDeTestes);
	}
	
	public void desenharTelaDefinaValoresParaVariaveisSystemInEOut()
	{
		CriaPainelDeFundoComBackground criadorPainelPadrao = CriaPainelDeFundoComBackground.getInstance();
		JPanel painelDefinaValoresParaVariaveisSystemInEOut = criadorPainelPadrao.criarPainelDeFundoPadraoDoSistema();
		GridBagLayout layoutDefinaValoresParaVariaveis = new GridBagLayout();
		painelDefinaValoresParaVariaveisSystemInEOut.setLayout(layoutDefinaValoresParaVariaveis);
		GridBagConstraints g = new GridBagConstraints();
		
		SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
				SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
		String textoLabelTitulo = conheceLinguagemDoSistema.getString("labelTituloTelaDefinaValoresParaVariaveisSystemInEOut");
		
		JLabel labelTitulo = CriadorTextLabel.criarTextlabel(textoLabelTitulo,16);
		g.gridheight = 1;
		g.gridx = 0;
		g.gridy = 0;
		g.gridwidth = 3;
		painelDefinaValoresParaVariaveisSystemInEOut.add(labelTitulo,g);
		
		JPanel painelDescricaoEHelp = this.criarPainelDescricao1EBotaoHelp();
		g.gridy = 1;
		g.gridwidth = 3;
		g.gridx = 0;
		g.gridheight = 1;
		painelDefinaValoresParaVariaveisSystemInEOut.add(painelDescricaoEHelp,g);
		
		String textoLabelDescricao2 = conheceLinguagemDoSistema.getString("labelDescricao2TelaDefinaValoresParaVariaveisSystemInEOut");
		JLabel labelDescricao2 = CriadorTextLabel.criarTextlabel(textoLabelDescricao2,16);
		
		g.gridy = 2;
		g.gridwidth = 3;
		g.gridx = 0;
		g.gridheight = 1;
		painelDefinaValoresParaVariaveisSystemInEOut.add(labelDescricao2,g);
		
		String textoLabelDescricao3 = conheceLinguagemDoSistema.getString("labelDescricao3TelaDefinaValoresParaVariaveisSystemInEOut");
		JLabel labelDescricao3 = CriadorTextLabel.criarTextlabel(textoLabelDescricao3,16);
		g.gridy = 3;
		g.gridwidth = 3;
		g.gridx = 0;
		g.gridheight = 1;
		painelDefinaValoresParaVariaveisSystemInEOut.add(labelDescricao3,g);
		
		//agora o botao para realmente testar o main com os valores informados
		
		String textoBotaoTestar = conheceLinguagemDoSistema.getString("botaoTestarTelaDefinaValoresParaVariaveisSystemInEOut");
		this.botaoTestar = new JButton(textoBotaoTestar);
		this.botaoTestar.addActionListener(this);
		
		g.insets = new Insets(10, 0, 0, 0);
		g.gridx = 0;
		g.gridy = 4;
		g.gridheight = 8;
		g.gridwidth = 3;
		JScrollPane painelValoresATestarJahInseridos = this.criarPainelComTabelaDeValoresJahInseridos();
		painelValoresATestarJahInseridos.setPreferredSize(new Dimension(1000, 350));
		painelDefinaValoresParaVariaveisSystemInEOut.add(painelValoresATestarJahInseridos,g);
		
		JPanel painelBotoes = criadorPainelPadrao.criarPainelDeFundoPadraoDoSistema();
		painelBotoes.add(botaoTestar);
		g.gridy = 13;
		g.gridheight = 1;
		g.gridwidth = 3;
		g.gridx = 0;
		painelDefinaValoresParaVariaveisSystemInEOut.add(painelBotoes,g);
		
		
		
		janelaDefinaValoresParaVariaveisSystemInEOut.getContentPane().add(painelDefinaValoresParaVariaveisSystemInEOut);
		
		
		janelaDefinaValoresParaVariaveisSystemInEOut.getContentPane().revalidate();
		janelaDefinaValoresParaVariaveisSystemInEOut.getContentPane().setVisible(true);
		
	}

	private JPanel criarPainelDescricao1EBotaoHelp()
	{
		SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
				SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
		CriaPainelDeFundoComBackground criadorPainelPadrao = CriaPainelDeFundoComBackground.getInstance();
		
		String textoLabelDescricao = conheceLinguagemDoSistema.getString("labelDescricaoTelaDefinaValoresParaVariaveisSystemInEOut");
		JLabel labelDescricao = CriadorTextLabel.criarTextlabel(textoLabelDescricao,16);
		ImageIcon iconeHelp = CriadorImageIcon.criarImageIcon("imagens/botaohelp.jpg", "botao help");
		this.botaoHelp = new JLabel(iconeHelp);
		this.botaoHelp.addMouseListener(this);
		JPanel painelUneHelpEDescricao = criadorPainelPadrao.criarPainelDeFundoPadraoDoSistema();
		GridBagLayout layout = new GridBagLayout();
		painelUneHelpEDescricao.setLayout(layout);
		
		GridBagConstraints grid = new GridBagConstraints();
		grid.fill = GridBagConstraints.HORIZONTAL;
		painelUneHelpEDescricao.add(labelDescricao,grid);
		painelUneHelpEDescricao.add(this.botaoHelp,grid);
		
		return painelUneHelpEDescricao;
	}
	

	@Override
	public void actionPerformed(ActionEvent e) 
	{
		Object objetoClicado = e.getSource();
		
		SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
				SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
		
		if(objetoClicado == this.botaoTestar)
		{
			
			boolean algumTextFieldNaoFoiPreenchido = this.algumTextFieldNaoFoiPreenchido();
			
			if(algumTextFieldNaoFoiPreenchido == true)
			{
				String textoDialog = conheceLinguagemDoSistema.getString("algumCampoNaoPreenchidoTelaDefinaValoresParaVariaveisSystemInEOut");
				
				JOptionPane.showMessageDialog(this.janelaDefinaValoresParaVariaveisSystemInEOut,
						textoDialog);
			}
			else
			{
				janelaDefinaValoresParaVariaveisSystemInEOut.getContentPane().setVisible(false);
				janelaDefinaValoresParaVariaveisSystemInEOut.getContentPane().removeAll();
				janelaDefinaValoresParaVariaveisSystemInEOut.getContentPane().invalidate();
				
				this.prepararTodosOsCasosDeTesteQueIremosTestar();
				
				ExecutadorDeCasosDeTeste executadorTestes = new ExecutadorDeCasosDeTeste(casosDeTesteCriadosParaSeTestar);
				executadorTestes.executarTodosOsCasosDeTeste();
				// falta criar tela de resultados do teste
				TelaResultadosDosTestesEmTabelaParaTestarMain telaResultadosDosTestes = new TelaResultadosDosTestesEmTabelaParaTestarMain(casosDeTesteCriadosParaSeTestar, executadorTestes.getCasosDeTesteERetornosAposExecucao() , executadorTestes.getCasosDeTesteESeEleConseguiuSerExecutado(), this.projetoDeTestesSendoCriado, this.quantasVariaveisCriadasParaSubstituirLeituraDoTeclado, this.quantasVariaveisCriadasParaSubstituirEscritaNoTerminal, this.janelaDefinaValoresParaVariaveisSystemInEOut);
				telaResultadosDosTestes.desenharTelaResultadosDosTestes();
				//this.janelaDefinaValoresParaVariaveisSystemInEOut.dispose();
				this.desenharPopUpMostraAoUsuarioAClasseTestadaComVariaveis();
			}
		}
		
	}

	
	private void prepararTodosOsCasosDeTesteQueIremosTestar()
	{
		//irei percorrer cada linha da tabela e sair criando os casos de teste necessarios
		LinkedList<LinhaTabela> linhasDaTabela = this.tabelaCasosDeTesteCriados.pegarLinhasDaTabela();
		for(int i = 0; i < linhasDaTabela.size(); i++)
		{
			LinhaTabela umaLinha = linhasDaTabela.get(i);
			LinkedList<CasoDeTeste> casosDeTesteGeradosAPartirDessaLinha = this.prepararUmCasoDeTesteParaTestarUmMain(umaLinha);
			
			this.casosDeTesteCriadosParaSeTestar.addAll(casosDeTesteGeradosAPartirDessaLinha);
		}
	}
	
	
	/*cada linha representa um caso de teste diferente e por isso eu irei sair percorrendo cada linha
	 * e achando entradas e saidas do caso de teste. A funcao nao retorna um soh caso de teste, mas eh pq eh assim: Quando se
	 * trata se testar um main, nao podemos simplesmente mandar executar uma operacao, temos de chamar as funcoes set() para cada
	 * variavel, seja ela para susbtituir entrada do teclado ou saida no terminal e ainda temos de executar o metodo main().
	 * Por isso, nessa funcao, um caso de teste da tabela serah transformado em varios*/
	private LinkedList<CasoDeTeste> prepararUmCasoDeTesteParaTestarUmMain(LinhaTabela umaLinhaDaTabela) 
	{
		/*cada linha representa um caso de teste diferente e por isso eu irei sair percorrendo ela
		 * e achando entradas e saidas do caso de teste*/
			
		LinkedList<String> saidasParaCriarCasoDeTeste = new LinkedList<String>();
		LinkedList<String> entradasParaCriarCasoDeTeste = new LinkedList<String>();
			
		LinkedList<String> valoresDaLinha = umaLinhaDaTabela.pegarValoresDaLinha();
			
		int quantosValoresVariaveisLeituraDoTecladoForamAchados = 0;
		boolean todasAsLeiturasDoTecladoForamAchadas = false;
			
			/*alguns valores da linha da minha tabela sao valores para variaveis que substituem
			 * leitura do teclado e outras substituem escritas no terminal. Como vou
			 * diferenciar esses valores? Eu sei quantas variaveis existem para cada situacao
			 * por isso eh soh percorrer a linha ate chegar no numero de variaveis usadas
			 * para susbtituir leitura da teclado que eu acho todas as entradas da minha
			 * aplicacao*/
			
		for(int j = 0; j < valoresDaLinha.size(); j++)
		{
			String umValor = valoresDaLinha.get(j);
			quantosValoresVariaveisLeituraDoTecladoForamAchados =
						quantosValoresVariaveisLeituraDoTecladoForamAchados + 1;
				
			if(todasAsLeiturasDoTecladoForamAchadas == false)
			{
				entradasParaCriarCasoDeTeste.add(umValor);
					
				if(quantosValoresVariaveisLeituraDoTecladoForamAchados == this.quantasVariaveisCriadasParaSubstituirLeituraDoTeclado)
				{
					todasAsLeiturasDoTecladoForamAchadas = true;
				}
			}
			else
			{
				saidasParaCriarCasoDeTeste.add(umValor);
			}
		}
			
		//percorremos um caso de teste todo
		//vamos ter de criar novos objetos DadosCasoDeTEstesComMain para inserir em DadosProjetoDeTestesComMain...
		this.criarNovosDadosDeCasoDeTestesEInserirNosDadosDoProjetoDeTestes(entradasParaCriarCasoDeTeste, saidasParaCriarCasoDeTeste);
		
		LinkedList<CasoDeTeste> casosDeTesteParaTestar = new LinkedList<CasoDeTeste>();
		
		//agora, preparar o caso de testes e mais os sests() das variaveis e o main()
		
		PreparaCasosDeTesteSetVariaveisEntrada criadorSettersCasoDeTeste =
				new PreparaCasosDeTesteSetVariaveisEntrada(entradasParaCriarCasoDeTeste);
		LinkedList<CasoDeTeste> casosDeTesteSettersVariaveisDoMain = 
				criadorSettersCasoDeTeste.criarCasosDeTesteSetVariaveisEntrada(this.enderecoDoArquivoJavaEscolhidoParaTestar);
		casosDeTesteParaTestar.addAll(casosDeTesteSettersVariaveisDoMain);
		
		//falta o caso de teste do main...
		PreparaCasoDeTesteComMain criaCasoDeTesteComMain = new PreparaCasoDeTesteComMain();
		CasoDeTeste casoDeTesteMain = criaCasoDeTesteComMain.prepararCasoDeTesteParaMainSemEntradasESaidasEsperadas(enderecoDoArquivoJavaEscolhidoParaTestar);
		casosDeTesteParaTestar.add(casoDeTesteMain);
		
		//e os getters pra ver se o resultado obtido foi igual ao esperado...
		
		PreparaCasosDeTesteGetVariaveisSaida criaCasosDeTesteCompararSaida =
				new PreparaCasosDeTesteGetVariaveisSaida(saidasParaCriarCasoDeTeste);
		LinkedList<CasoDeTeste> casosDeTesteCompararSaidaEsperada = criaCasosDeTesteCompararSaida.criarCasosDeTesteGetVariaveisEntradaSaida(enderecoDoArquivoJavaEscolhidoParaTestar);
		
		casosDeTesteParaTestar.addAll(casosDeTesteCompararSaidaEsperada);
		
		return casosDeTesteParaTestar;
	}
	
	
	//veremos se algum texfield de alguma linha da tabela ainda nao foi preenchido
	private boolean algumTextFieldNaoFoiPreenchido()
	{
		LinkedList<LinhaTabela> linhasDaTabela = this.tabelaCasosDeTesteCriados.pegarLinhasDaTabela();
		for(int i = 0; i < linhasDaTabela.size(); i++)
		{
			LinhaTabela umaLinha = linhasDaTabela.get(i);
			LinkedList<JTextField> textFieldsDessaLinha = umaLinha.pegarTextFieldsDaLinha();
			
			for(int j = 0; j < textFieldsDessaLinha.size(); j++)
			{
				JTextField umTextField = textFieldsDessaLinha.get(j);
				
				if(umTextField.getText().length() == 0)
				{
					//encontramos um textfield vazio
					return true;
				}
			}
		}
		
		//percorremos todos os textfields de todas as linhas e nao achamos nenhum vazio
		return false;
	}
	
	
	/*mostra o pop-up com a classe a ser testada pelo usuario e comentarios dizendo onde estao
	 * as variaveis que substituem system.in e system.out*/
	private void desenharPopUpMostraAoUsuarioAClasseTestadaComVariaveis()
	{
		TelaMostraConteudoDeArquivoEmUmTextArea mostraAoUsuarioAsVariaveisCriadas = 
				new TelaMostraConteudoDeArquivoEmUmTextArea(this.enderecoDoArquivoJavaEscolhidoParaTestar);
		mostraAoUsuarioAsVariaveisCriadas.desenharTelaMostraConteudoDeArquivoEmUmTextArea();
	}
	
	
	private JScrollPane criarPainelComTabelaDeValoresJahInseridos()
	{
		this.cabecalhoDaTabela = new LinkedList<String>();
		
		SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
				SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
		
		for(int i = 0; i < this.quantasVariaveisCriadasParaSubstituirLeituraDoTeclado; i++)
		{
			System.out.println("entrada encontrada para tabela");
			int indiceVariavelEntrada = i + 1;
			
			String tituloEntrada = conheceLinguagemDoSistema.getString("cabecalhoDaTabelaEntradaTelaDefinaValoresParaVariaveisSystemInEOut");
			cabecalhoDaTabela.add(tituloEntrada + indiceVariavelEntrada);
		}
		
		for(int j = 0; j < this.quantasVariaveisCriadasParaSubstituirEscritaNoTerminal; j++)
		{
			System.out.println("saida encontrada para tabela");
			int indiceVariavelSaida = j + 1;
			
			String tituloSaida = conheceLinguagemDoSistema.getString("cabecalhoDaTabelaSaidaTelaDefinaValoresParaVariaveisSystemInEOut");
			
			cabecalhoDaTabela.add(tituloSaida + indiceVariavelSaida);
		}
		
		
		
		this.tabelaCasosDeTesteCriados = new PainelTabela(cabecalhoDaTabela);
	
		
		CriaPainelDeFundoComBackground criadorPainelPadrao = CriaPainelDeFundoComBackground.getInstance();
		JPanel panel = criadorPainelPadrao.criarPainelDeFundoPadraoDoSistema();
		panel.setLayout(new BorderLayout());
		panel.add(tabelaCasosDeTesteCriados, BorderLayout.CENTER);
		
		
		JScrollPane scrollParaTabelaValoresInseridos = new JScrollPane(panel);
		
		
		return scrollParaTabelaValoresInseridos;
		
	}
	
	
	/*metodos referentes a um projeto de testes jah salvo */
	public void setProjetoDeTestesSendoCriado(DadosProjetoDeTestesComMain projetoSalvoPreviamente) 
	{	
		this.projetoDeTestesSendoCriado = projetoSalvoPreviamente;
	}
	
	/**
	 * chamar na hora de loadar o projeto de testes, mas soh depois de ter desenhado a tela!
	 * @param projetoSalvoPreviamente
	 */
	public void inserirValoresDemProjetoDeTestesJahSalvoNatabela(DadosProjetoDeTestesComMain projetoSalvoPreviamente)
	{
		//escrever o caso de testes na tabela...
		//primeiro esvaziaremos a tabela porque ela ja tinha pelo menos 1 linha vazia
		this.tabelaCasosDeTesteCriados.destruirTodaATabela();
		
		//agora echeremos a tabela com linhas prontas
		LinkedList<DadosCasoDeTestesComMain> casosDeTestejahCriados = projetoSalvoPreviamente.getDadosDosCasosDeTestesCriados();
		for(int i = 0; i < casosDeTestejahCriados.size(); i++)
		{
			DadosCasoDeTestesComMain dadosCasoDeTestejahCriados = casosDeTestejahCriados.get(i);
			LinkedList<String> valoresDeUmaNovaLinhaDaTabela = new LinkedList<String>();
			//esses valores de uma nova linha sao os system ins(entradas do metodo) primeiro e depois os system outs(saida esperada)...
			
			valoresDeUmaNovaLinhaDaTabela.addAll(dadosCasoDeTestejahCriados.getValoresDeEntradaSystemInParaTestar());
			valoresDeUmaNovaLinhaDaTabela.addAll(dadosCasoDeTestejahCriados.getValoresDeSaidaSystemOutEsperados());
			
			LinkedList<String> novoCasoDeTesteAdicionarnaTabela = new LinkedList<String>();
			
			for(int z = 0; z < valoresDeUmaNovaLinhaDaTabela.size(); z++)
			{
				String valorDeEntradaUnico = valoresDeUmaNovaLinhaDaTabela.get(z);
				novoCasoDeTesteAdicionarnaTabela.add(valorDeEntradaUnico);
			}
			
			this.tabelaCasosDeTesteCriados.criarUmaLinhaDaTabelaPreenchida(novoCasoDeTesteAdicionarnaTabela);
		}
		
	}
	/*fim dos metodos referentes a um projeto de testes jah salvo */
	
	/**
	 * esse metodo serve para ser criada uma nova instancia de DadosCasoDeTestesComMain e adicionar essa instancia a
	 * DadosProjetoDeTestesComMain e este, por sua vez, eh util na hora de salvar o projeto de testes.
	 * 
	 * @param entradasFornecidasParaTeste
	 * @param saidasEsperadasParaTeste
	 */
	private void criarNovosDadosDeCasoDeTestesEInserirNosDadosDoProjetoDeTestes(LinkedList<String> entradasFornecidasParaTeste, LinkedList<String> saidasEsperadasParaTeste)
	{
		DadosCasoDeTestesComMain dadosDeUmNovoCasoDeTestes = new DadosCasoDeTestesComMain();
		dadosDeUmNovoCasoDeTestes.setValoresDeEntradaSystemInParaTestar(entradasFornecidasParaTeste);
		dadosDeUmNovoCasoDeTestes.setValoresDeSaidaSystemOutEsperados(saidasEsperadasParaTeste);
		this.projetoDeTestesSendoCriado.adicionarCasoDeTestesAoProjeto(dadosDeUmNovoCasoDeTestes);
	}

	@Override
	public void mouseClicked(MouseEvent arg0) 
	{
		if(arg0.getSource() == this.botaoHelp)
		{
			this.desenharPopUpMostraAoUsuarioAClasseTestadaComVariaveis();
		}
		
	}

	@Override
	public void mouseEntered(MouseEvent arg0) 
	{
		if(arg0.getSource() == this.botaoHelp)
		{
			Cursor cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); 
		    this.botaoHelp.setCursor(cursor);
		}
	}

	@Override
	public void mouseExited(MouseEvent arg0) 
	{
		if(arg0.getSource() == this.botaoHelp)
		{
			Cursor cursor = Cursor.getDefaultCursor(); 
			this.botaoHelp.setCursor(cursor);
		}
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}
